package simpledb.transaction;

/**
 * Lock 类用于表示一个事务对某个数据库页面所持有的锁。它记录了两个关键信息：
 * 1、是哪个事务（TransactionId）持有了这个锁；
 * 2、这个锁是读锁还是写锁（通过 lockType 来区分）。
 * 这是 SimpleDB 中实现并发控制机制的重要组成部分，通常与 LockManager 一起使用来管理多个事务对页面的访问权限。
 */
public class Lock {

    // 持有该锁的事务ID
    private TransactionId tid;

    // 锁类型：
    // 0 表示共享锁（Shared Lock / Read Lock）
    // 1 表示排他锁（Exclusive Lock / Write Lock）
    private int           lockType;

    /**
     * 构造一个新的锁对象。
     *
     * @param tid      持有锁的事务ID
     * @param lockType 锁类型（0: 读锁, 1: 写锁）
     */
    public Lock(final TransactionId tid, final int lockType) {
        this.tid = tid;
        this.lockType = lockType;
    }

    /**
     * 获取当前锁的类型。
     *
     * @return 锁类型（0: 读锁, 1: 写锁）
     */
    public int getLockType() {
        return lockType;
    }

    /**
     * 设置当前锁的类型。
     * 通常用于将读锁升级为写锁。
     *
     * @param lockType 新的锁类型（0: 读锁, 1: 写锁）
     */
    public void setLockType(final int lockType) {
        this.lockType = lockType;
    }

    /**
     * 获取持有该锁的事务ID。
     *
     * @return 持有锁的事务ID
     */
    public TransactionId getTid() {
        return tid;
    }
}
